package com.demo.commons;

import cn.lingyangwl.framework.rabbitmq.callback.MessageConfirmCallback;
import com.demo.returned_message.MessageReturnsCallback;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

/**
 * @author shenguangyang
 */
@Component
@Configuration
public class MqConfig {
    @Resource
    private CachingConnectionFactory connectionFactory;

    @Resource
    private MessageConfirmCallback messageConfirmCallback;

    @Resource
    private MessageReturnsCallback messageReturnsCallback;

    @Bean
    public Jackson2JsonMessageConverter jsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }

    @PostConstruct
    public void init() {

    }

    /**
     * 模板的初始化配置
     *
     */
    @Bean
    public RabbitTemplate rabbitTemplate() {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(jsonMessageConverter());
        // 开启事务配置
        // 开启事务会大幅降低消息发送及接收效率，因为当已经有一个事务存在时，后面的消息是不能被发送或者接收（对同一个consumer而言）的。
        // rabbitTemplate.setChannelTransacted(true);
        rabbitTemplate.setConfirmCallback(messageConfirmCallback);
        /*
         * true: 交换机无法将消息进行路由时，会将该消息返回给生产者
         * false: 如果发现消息无法进行路由，则直接丢弃
         */
        rabbitTemplate.setMandatory(true);
        /*
         * 设置回退消息交给生产者处理
         * 如何生效
         * 在yaml文件中配置spring.rabbitmq.publisher-returns: true, 没有被正确路由到合适队列的消息也会回调该方法
         */
        rabbitTemplate.setReturnsCallback(messageReturnsCallback);
        return rabbitTemplate;
    }
}
